package identity

import (
	"fmt"
	"net"
	"os"
	"strings"
)

// ServerIdentity 服务器标识信息
type ServerIdentity struct {
	Hostname string `json:"hostname"`
	IP       string `json:"ip"`
	ID       string `json:"id"` // 组合标识符
}

var (
	// ServerInfo 全局服务器信息
	ServerInfo *ServerIdentity
)

// InitServerIdentity 初始化服务器标识
func InitServerIdentity() error {
	// 获取主机名
	hostname, err := os.Hostname()
	if err != nil {
		hostname = "unknown"
	}

	// 获取本机IP地址
	ip, err := getLocalIP()
	if err != nil {
		ip = "unknown"
	}

	// 创建服务器标识
	ServerInfo = &ServerIdentity{
		Hostname: hostname,
		IP:       ip,
		ID:       fmt.Sprintf("%s(%s)", hostname, ip),
	}

	return nil
}

// getLocalIP 获取本机IP地址
func getLocalIP() (string, error) {
	// 尝试连接到一个外部地址来获取本机IP
	conn, err := net.Dial("udp", "8.8.8.8:80")
	if err != nil {
		return "", err
	}
	defer conn.Close()

	localAddr := conn.LocalAddr().(*net.UDPAddr)
	return localAddr.IP.String(), nil
}

// GetServerID 获取服务器标识
func GetServerID() string {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return ServerInfo.ID
}

// GetHostname 获取主机名
func GetHostname() string {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return ServerInfo.Hostname
}

// GetIP 获取IP地址
func GetIP() string {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return ServerInfo.IP
}

// GetFormattedID 获取格式化的服务器标识
func GetFormattedID() string {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return fmt.Sprintf("[%s]", ServerInfo.ID)
}

// GetShortID 获取短标识（仅主机名）
func GetShortID() string {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return ServerInfo.Hostname
}

// GetFullInfo 获取完整服务器信息
func GetFullInfo() *ServerIdentity {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	return ServerInfo
}

// SetCustomID 设置自定义服务器标识
func SetCustomID(customID string) {
	if ServerInfo == nil {
		InitServerIdentity()
	}
	
	// 如果自定义ID包含主机名和IP，则使用自定义ID
	if strings.Contains(customID, "(") && strings.Contains(customID, ")") {
		ServerInfo.ID = customID
	} else {
		// 否则组合主机名和自定义ID
		ServerInfo.ID = fmt.Sprintf("%s(%s)", ServerInfo.Hostname, customID)
	}
}
